package com.itheima.distributed;

import com.google.gson.Gson;
import com.itheima.dao.NewsDao;
import com.itheima.pojo.News;
import com.itheima.pojo.SpiderFinal;
import com.itheima.producer.KafkaSpiderProducer;
import com.itheima.tools.JedisUtil;
import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.jar.JarFile;

/**
 * 公用的DAO
 * 读取redis中的News对象，
 * 判断这个url是否已经爬取过，
 * 将这个News对象保存到mysql数据库中，
 * 还需要将这个url保存到set集合中
 */
public class PublicNewsDao {

    //创建生产者对象
    private static KafkaSpiderProducer kafkaSpiderProducer = new KafkaSpiderProducer();

    /*
        需要json转换和NewsDao
     */
    private static Gson gson = new Gson();
    private static NewsDao newsDao = new NewsDao();

    public static void main(String[] args) {
        while (true) {
            //读取redis中的news对象
            Jedis jedis = JedisUtil.getJedis();
            //brpop式阻塞队列,表示在列尾 阻塞式的去除消息 ,阻塞20秒,再继续接收,以确保不会由于网络等因素漏掉数据
            List<String> jsonList = jedis.brpop(20, SpiderFinal.SPIDER_NEWS_NEWJSONLIST);
            jedis.close();

            //跳出循环的条件
            if (jsonList == null || jsonList.size() == 0){
                break;
            }

            //判断是否已经爬取过
            String newsJson = jsonList.get(1);
            //把json转换为对象
            News news = gson.fromJson(newsJson, News.class);
            boolean hasParsed = hasParsed(news.getDocurl());
            if (hasParsed){
                continue;
            }
            //没有重复,那么就保存到数据库中
            newsDao.saveNews(news);

            //保存到数据库之后,保存到kafka中取
            kafkaSpiderProducer.messageToKafka(newsJson);

            //将这个新闻的url保存到redis的set集合中
            jedis = JedisUtil.getJedis();
            jedis.sadd(SpiderFinal.SPIDER_NEWS_URLSET,news.getDocurl());
            jedis.close();
        }
    }

    /**
     * 判断是否已经爬取过
     * 把链接传进来,再redis的set中进行查找,看有没有对应的数据
     * @param docUrl
     * @return
     */
    public static boolean hasParsed(String docUrl){
        //获取链接
        Jedis jedis = JedisUtil.getJedis();
        //判断 在redis中的set集合 这里选择公用的set集合,来判断是不是爬取过
        Boolean sismember = jedis.sismember(SpiderFinal.SPIDER_NEWS_URLSET, docUrl);
        //关闭
        jedis.close();
        //返回
        return sismember;

    }


}
